#include "screen_display.h"             // 引入头文件
#include <SPIFFS.h>                     // 文件系统库
#include "LGFX_ESP32C3_ST7789.h"        // 屏幕驱动配置
#include <Arduino.h>

extern WebServer server;                // Web服务器实例
LGFX tft;                               // 显示屏对象
bool spiffsInitialized = false;         // SPIFFS是否已初始化

// ------------------------- 获取下一个可用图片编号 -------------------------
int getNextImageIndex() {
  int index = 1;                                         // 从1开始编号
  File root = SPIFFS.open("/");                          // 打开SPIFFS根目录
  if (!root || !root.isDirectory()) return 1;            // 若目录无效则返回1

  bool used[256] = {false};                              // 最多支持256张图片
  File file = root.openNextFile();                       // 遍历文件
  while (file) {
    String name = file.name();                           // 获取文件名
    if (name.startsWith("/img_") && name.endsWith(".jpg")) {
      int num = name.substring(5, name.length() - 4).toInt(); // 提取编号
      if (num > 0 && num < 256) used[num] = true;        // 标记编号占用
    }
    file = root.openNextFile();                          // 继续下一个
  }

  for (index = 1; index < 256; index++) {                // 查找最小未占用编号
    if (!used[index]) return index;
  }
  return 256;                                            // 若满则返回256
}

// ------------------------- 处理图片上传 -------------------------
void handleUpload() {
  HTTPUpload& upload = server.upload();                  // 获取上传状态对象
  static File uploadFile;                                // 当前写入文件对象
  static String filename;                                // 当前文件名记录

  // 上传开始阶段
  if (upload.status == UPLOAD_FILE_START) {
    if (!spiffsInitialized) {                            // 若尚未初始化
      if (SPIFFS.begin(true)) {
        spiffsInitialized = true;                        // 标记已挂载
        Serial.println("[SPIFFS] 文件系统已挂载");
      } else {
        Serial.println("[SPIFFS] 挂载失败！");
        return;
      }
    }

    int index = getNextImageIndex();                     // 获取下一个可用编号
    filename = "/img_" + String(index) + ".jpg";         // 生成文件名
    uploadFile = SPIFFS.open(filename, FILE_WRITE);      // 打开文件写入
    Serial.printf("[UPLOAD] 开始写入: %s\n", filename.c_str());
  }

  // 上传数据阶段（⚙️ 此处改进）
  else if (upload.status == UPLOAD_FILE_WRITE) {
    if (uploadFile) uploadFile.write(upload.buf, upload.currentSize); // 写入数据块
    yield();                                            // 喂狗，防止WDT触发
  }

  // 上传结束阶段
  else if (upload.status == UPLOAD_FILE_END) {
    if (uploadFile) uploadFile.close();                  // 关闭文件
    Serial.printf("[UPLOAD] 完成 %s (%u bytes)\n", filename.c_str(), upload.totalSize);

    // 显示图片
    tft.fillScreen(TFT_BLACK);                           // 清屏
    tft.drawJpgFile(SPIFFS, filename, 0, 0);             // 显示上传的图片
  }
}


// ------------------------- 初始化屏幕显示 -------------------------
void initScreenDisplay() {
  tft.init();                                            // 初始化屏幕
  tft.setRotation(1);                                    // 设置屏幕方向
  tft.fillScreen(TFT_BLACK);                             // 初始清屏

  // 初始化SPIFFS文件系统（只执行一次）
  if (!spiffsInitialized) {
    if (SPIFFS.begin(true)) {
      spiffsInitialized = true;
      Serial.println("[SPIFFS] 文件系统已挂载");
    } else {
      Serial.println("[SPIFFS] 挂载失败！");
    }
  }

  // 注册HTTP上传接口
  server.on("/upload", HTTP_POST, []() {
    server.send(200, "text/plain", "OK");                // 上传完成响应
  }, handleUpload);                                      // 处理上传逻辑
}

// ------------------------- 屏幕刷新逻辑 -------------------------
void handleScreenDisplay() {
  // 预留接口：后续可添加自动播放图片/动画等逻辑
}
